home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / dcg301up / merchant.scr < prev    next >
Text File  |  1993-05-24  |  12KB  |  377 lines

  1. !
  2. ! Default merchant script..
  3. !
  4. ! (c) DC Software, 1993
  5. !
  6. ! Pending Enhancements
  7. !
  8. ! - I need to create a voice file (.VFL) with voices for this script.
  9. !   Look at the 'voice()' entries to see what voices it would play if
  10. !   they were available.  These voices could even be placed in the
  11. !   system's voice file (DCSOUNDS.VFL) in which case the voice command
  12. !   should read 'voice( xxxx, 1000 )'.
  13. !
  14.  
  15. !------------------------------------------------------------------------!
  16. :@TALK ! Talk to the character !
  17. !------------------------------------------------------------------------!
  18.  
  19. ! First, say hello.. !
  20.   if NPC.V0 > 0 then
  21.     writeln( "Hello ", player.name, ". What brings you back?" );
  22.   else
  23.     writeln( "Welcome to ", npc.name, ". How may I help you?" );
  24.   endif;
  25.  
  26. ! Now, set some variables..
  27.   NPC.V0 = 1; ! From know on, remember we've been here
  28.   L1 = 0;     ! No items have been SOLD to the player
  29.   L2 = 0;     ! No items have been BOUGHT from the player
  30.  
  31. ! Then start a loop and show a menu..
  32. :LOOP
  33.   L3 = select( "Buy", "Sell", "Identify", "Talk", "Bye" );
  34.   on L3 goto BUY, SELL, GETINFO, CHAT;
  35.  
  36. ! ESCape and BYE get's us out of here..
  37. :CSTOP
  38.   if L1 = 0 and L2 = 0 then
  39.     writeln( "Next time buy something!" );
  40.   else
  41.     writeln( "It's been a pleasure doing business with you!" );
  42.   endif;
  43.   STOP;
  44.  
  45. !-------------------------------------------------!
  46. ! Player want's to buy something from us..        !
  47. !-------------------------------------------------!
  48. :BUY
  49.   L3 = select$( NPC );
  50.   if L3 < 0 goto LOOP;
  51.  
  52.   if NPC.BP.VALUE >= GROUP.GOLD then 
  53.     writeln( "You don't have enough money!");
  54.     voice( "Broke" );
  55.   else
  56.     if npc.bp.type = FOOD and npc.bp.class = NONE then
  57.       L10 = 255 - group.food; ! Max food we can carry !
  58.       if L10 < npc.bp.count then
  59.         L11 = npc.bp.count - L10;
  60.         writeln( "{You have to carry ", L11, " in your backpack}" );
  61.         inc( group.food, L10 );
  62.         copy( npc.bp, player, L11 ); ! Put L11 foods in the backpack !
  63.         if failure then
  64.           L12 = failure - 1;
  65.           writeln( "{The excess merchandize is placed on the floor!}" );
  66.           drop( npc.bp, -L12 ); ! Negative count means "drop a copy" !
  67.         endif;
  68.       else
  69.         inc( group.food, npc.bp.count );
  70.       endif;
  71.     else
  72.       L12 = npc.bp.count;
  73.       copy( NPC.BP, PLAYER );
  74.       if failure then
  75.         ! Value of failure is # that DID NOT get moved (+1) !
  76.         L11 = failure - 1;
  77.         if L12 > 1 then
  78.           if L11 < L12 then
  79.             writeln( "You can only carry {", L11, "} of them!" );
  80.           else
  81.             writeln( "You can't carry them!" );
  82.           endif;
  83.         else
  84.           writeln( "You can't carry it!" );
  85.         endif;
  86.         writeln( "The ", npc.bp.name, " is ON THE FLOOR!" );
  87.         if npc.x = player.x then
  88.           L13 = npc.x;
  89.           L14 = player.y + sgn(npc.y - player.y);
  90.         else
  91.           L13 = player.x + sgn(npc.x - player.x);
  92.           L14 = npc.y;
  93.         endif;
  94.         drop( npc.bp, -L11, L13, L14 ); ! Leave a copy (-) under the PLAYER !
  95.       endif;
  96.     endif;
  97.     dec ( GROUP.GOLD, NPC.BP.VALUE );
  98.     inc ( L1 );                     ! Sold 1 item to the PLAYER !
  99.     writeln( "SOLD: ", NPC.BP.COUNT, " ", NPC.BP.NAME, " for ", $NPC.BP.VALUE );
  100.     voice( "Sold" );
  101.   endif;
  102.   goto BUY;
  103.  
  104. !
  105. ! Player want's to sell something to us..
  106. !
  107. :SELL
  108.   L3 = select$2( PLAYER, matching ); ! Shows only thing's that I might want to buy  !
  109.   if L3 < 0 then
  110.     if L3 = -2 then   ! No items in the player's backpack !
  111.       if L2 > 0 then
  112.         writeln( "You have no more items to sell." );
  113.         voice( "NonLeft" );
  114.       else
  115.         writeln( "You have no items to sell." );
  116.         voice( "NoItems" );
  117.       endif;
  118.     endif;
  119.     if L3 = -3 then   ! No items of the type(s) I sell in the backpack !
  120.       if L2 > 0 then
  121.         writeln( "You have no more items that I would like to buy." );
  122.         voice( "NonLeft" );
  123.       else
  124.         writeln( "You have no items that I would like to buy." );
  125.         voice( "NoItems" );
  126.       endif;
  127.     endif;
  128.     goto LOOP;
  129.   endif;
  130.  
  131. ! Buy an item at half price (it's used) !
  132.   if player.bp.count > 1 then
  133.     L10 = getnum( "Sell how many?", 0, player.bp.count );
  134.   else
  135.     L10 = 1;
  136.   endif;
  137.   if L10 > 0 then
  138.     if player.bp.type = FOOD and player.bp.class = POISON then
  139.       writeln( "Sorry. This food is poisoned.  Anything else?" );
  140.       goto SELL;
  141.     endif;
  142.     L4 = (PLAYER.BP.VALUE+1) / 2;   ! Price paid for the item.
  143.     if L10 > 1 then
  144.       writeln( "Here is ", $L4, " for each of your ", L10, " ", PLAYER.BP.NAME, "s" );
  145.     else
  146.       writeln( "Here is ", $L4, " for your ", PLAYER.BP.NAME );
  147.     endif;
  148.     voice( "Bought" );
  149.     inc( group.gold, L4*L10 );     ! Pay the player for the items
  150.     inc( L2 );                     ! Bought 1 item from the player !
  151.  
  152.     ! Now, see if we have an exact or approximate match
  153.     for L11 = 0 to 15 do
  154.       setbp( npc, L11 );
  155.       if npc.bp.count > 0               and
  156.          npc.bp.name  = player.bp.name  and
  157.          npc.bp.type  = player.bp.type  and
  158.          npc.bp.class = player.bp.class and
  159.          npc.bp.value = player.bp.value goto REMOVEIT;
  160.     endfor;
  161.     ! Merchant does not have an identical item, so we will copy 1 (one)
  162.     ! item into the backpack for later resale
  163.     !
  164.     ! Note: The assumption is that the 'value' field contains the
  165.     ! UNIT value.  If the player had 20 items, we paid 20 x value, so
  166.     ! we keep 1 copy and sell each for 'value' amount.
  167.     copy( player.bp, npc, 1 );
  168.  
  169.     :REMOVEIT
  170.     if L10 < player.bp.count then
  171.       dec( player.bp.count, L10 ); ! Remove the items we sold
  172.     else
  173.       player.bp.count = 0;         ! Zap the items
  174.     endif;
  175.   else
  176.     writeln( "Maybe another item? <ESC> for go back" );
  177.   endif;
  178.  
  179.   goto SELL;
  180.  
  181. !
  182. ! Player want's to know about some of the items he has..
  183. !
  184. :GETINFO
  185.   writeln( "Let me see.. What do you wish to identify?" );
  186.   L3 = select$2( PLAYER, matching ); ! Item's I know about !
  187.   if L3 < 0 then
  188.     if L3 = -2 then   ! No items in the player's backpack !
  189.       if L2 > 0 then
  190.         writeln( "You have no more items!" );
  191.         voice( "NonLeft" );
  192.       else
  193.         writeln( "Your backpack is empty!" );
  194.         voice( "NoItems" );
  195.       endif;
  196.     endif;
  197.     if L3 = -3 then   ! No items of the type(s) I sell in the backpack !
  198.       if L2 > 0 then
  199.         writeln( "There are no other items I can identify!" );
  200.         voice( "NonLeft" );
  201.       else
  202.         writeln( "There are no items that I can identify!" );
  203.         voice( "NoItems" );
  204.       endif;
  205.     endif;
  206.     goto LOOP;
  207.   endif;
  208.  
  209. ! Identify the selected item
  210.   L4 = (player.bp.value+7) / 8;
  211.   writeln( "The fee is ", $L4, ". Do you pay it?" );
  212.   L11 = select( "Yes", "No" );
  213.   if L11 = 0 then ! Yes !
  214.     if group.gold < L4 then
  215.       writeln( "You don't have enough money!" );
  216.       voice( "Broke" );
  217.       goto LOOP;
  218.     endif;
  219.     gosub DESCRIBE;
  220.     writeln( "What name do you want to give it? <ESC>=none" );
  221.     L3 = getstr();
  222.     if L3 = -2 then ! -1 = <ESC>, -2 = Any string not in the list (No List) !
  223.       player.bp.name = S0;
  224.     else
  225.       writeln( "ok" );
  226.     endif;
  227.     dec( group.gold, L4 );
  228.   else
  229.     writeln( "Maybe another item? <ESC> to go back" );
  230.   endif;
  231.  
  232.   goto GETINFO;
  233.  
  234. !-------------------------------------------------------------------!
  235. ! Describe an item (player's BP)                                    !
  236. !-------------------------------------------------------------------!
  237. :DESCRIBE
  238.  
  239.   if player.bp.count < 0 then
  240.     writeln( "I don't know what you're talking about" );
  241.     return;
  242.   endif;
  243.  
  244.   write( "Name: ", player.bp.name, ", Type: ", player.bp.type );
  245.  
  246.   if player.bp.type = FOOD or player.bp.type = POTION  then
  247.     if player.bp.class then
  248.       write( ", Class: ", player.bp.class );
  249.       if player.bp.class <> CURE then
  250.         write( ", Units: ", player.bp.units );
  251.       endif;
  252.     else
  253.       write( ", it has no special properties" );
  254.     endif;
  255.   elsif player.bp.type = WEAPON then
  256.     write( ", Class: ", player.bp.class, 
  257.            ", Hands: ", player.bp.hands, 
  258.            ", Range: ", player.bp.range, 
  259.            ", Damage: ", player.bp.damage );
  260.     if player.bp.ammoneeded then
  261.       write( ", Needs ammo type: ", player.bp.ammo_type );
  262.     endif;
  263.   elsif player.bp.type = AMMO then
  264.     write( ", Ammo Type: ", player.bp.ammotype );
  265.     if player.bp.traptype then
  266.       write( ", Poisoned" );
  267.     endif;
  268.     if player.bp.damage then
  269.       write( ", Extra Damage: ", player.bp.damage );
  270.     endif;
  271.   elsif player.bp.type = ARMOR or player.bp.type = SHIELD then
  272.     write( ", Armor Class: ", player.bp.ac );
  273.     if player.bp.cursed then
  274.       write( " Cursed!" );
  275.     endif;
  276.   elsif player.bp.type = AMULET or player.bp.type = RING or player.bp.type = GEMS then
  277.     if player.bp.class then
  278.       write( ", Class: ", player.bp.class );
  279.       write( ", Charges: ", player.bp.charges );
  280.       if player.bp.class <> CURE then
  281.         write( ", Units: ", player.bp.units );
  282.         if player.bp.permanent then
  283.           write( ", Permanent!" );
  284.         else
  285.           write( ", Temporary" );
  286.         endif;
  287.       endif;
  288.       if player.bp.cursed then
  289.         write( ", Cursed!" );
  290.       endif;
  291.     endif;
  292.   elsif player.bp.type = SCROLL then
  293.     write( ", Class: ", player.bp.class );
  294.   elsif player.bp.type = STAFF then
  295.     write( ", Class: ", player.bp.class, ", Charges: ", player.bp.charges );
  296.   elsif player.bp.type = CHEST then
  297.     if player.bp.locktype then
  298.       write( ", Locked!" );
  299.       if player.bp.traptype = 0 then
  300.         write( ", no traps" );
  301.       elsif player.bp.traptype = 1 then
  302.         write( ", poison trap" );
  303.       else
  304.         write( ", bomb damage: ", player.bp.traptype );
  305.       endif;
  306.     endif;
  307. ! elsif player.bp.type = KEYS     then
  308. !   nothing special about it
  309. ! elsif player.bp.type = BOOK     then
  310. !   nothing special about it
  311. ! elsif player.bp.type = GOLDSACK then
  312. !   nothing special about it
  313. ! elsif player.bp.type = TORCH    then
  314. !   nothing special about it
  315. ! elsif player.bp.type = LANTERN  then
  316. !   nothing special about it
  317. ! elsif player.bp.type = ROPE     then
  318. !   nothing special about it
  319. ! elsif player.bp.type = HOOKS    then
  320. !   nothing special about it
  321. ! elsif player.bp.type = MIRROR   then
  322. !   nothing special about it
  323. ! elsif player.bp.type = SIGN     then
  324. !   nothing special about it
  325.   elsif player.bp.type = VEHICLE then
  326.     write( ", Class: ", player.bp.class );
  327. ! else
  328. !   user defined type?
  329.   endif;
  330.   if player.bp.weight > 1 and player.bp.weight < 256 then
  331.     write( ", Weight: ", player.bp.weight );
  332.   endif;
  333.   writeln( "." );
  334.   return;
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342. !
  343. ! Handle conversation..
  344. !
  345. :CHAT
  346.   writeln( "What would you like to talk about?" );
  347.  
  348. :CHAT1
  349.   L3 = getstr("Name","Buy","Sell","Credit","Job","Bye");
  350.   if L3 = -1 then 
  351.     writeln( "Ok." );
  352.     goto LOOP; ! Pressed ESCape !
  353.   endif;
  354.  
  355. ! First, see if the keyword typed is in the character's text block !
  356.   if dotext( S0 ) then
  357.     if L3 = 5 then
  358.       STOP;
  359.     endif;
  360.     goto CHAT1;
  361.   endif;
  362.  
  363. ! It didn't, so try the predefined ones..
  364.   on L3 goto CNAME, BUY, SELL, CCREDIT, CJOB, CSTOP;
  365.  
  366. ! Nope, try a 'DEFAULT' line
  367.   if not dotext( "DEFAULT" ) then
  368.     writeln( "I don't know anything about that!" );
  369.   endif;
  370.   goto CHAT1;
  371.  
  372. :CNAME   writeln( "My name is ", NPC.name, "." ); GOTO CHAT1;
  373. :CCREDIT writeln( "No credit sales, sorry!"    ); GOTO CHAT1;
  374. :CJOB    writeln( "I {buy} and {sell} things!" ); GOTO CHAT1;
  375.  
  376. ! Feel free to expand on this list.. !
  377.